/*
*
* ts的基础类型，布尔值，数字，字符串，数组，元组（Tuple），枚举，任意值，空值。后面几个你不知道的就是新加的类型。看他们怎么定义。
* ts定义有Interface，熟悉其他语言可能知道，这为类型的安全。布尔值定义为
*
* */

let isDone: boolean = true
let number: number = 22
let name: string = 'sxd'
let str: string = `${name}几年${number}岁，他很${isDone ? '帅' : '丑'}`

// 数组
let list: number[] = [1, 2, 3, 4]
let list1: Array<number> = [5, 6, 7, 8]

// 新类型
// 元组
let q: [ string, number ]
q = ['1', 2]
// q = [1, 2] // error

/*
*  这个元组就是约定类型的已知数量的数组。x[0]是string类型，x[1]是number类型，只要不是编译器就报错。
*  console.log(q[0].substr(1)); // OK
*  console.log(q[1].substr(1)); // Error, 'number' does not have 'substr'
*  q[1]是数字类型，没有substr
* */

// q[3] = 5 // Tuple type '[string, number]' of length '2' has no element at index '3'.

/*
* 枚举
* enum类型是对JavaScript标准数据类型的一个补充。
* */

enum Color { Red, Green, Blue }
let c: Color = Color.Green
console.log('c:', Color[0])

// 任意值（any）
let notSure: any = 4;
notSure = "maybe a string instead";
/*
* 那定义这个any就会跳过编译器的检测。
* 你可能认为Object有相似的作用，就像它在其它语言中那样。 但是Object类型的变量只是允许你给它赋任意值 -- 但是却不能够在它上面调用任意的方法，即便它真的有这些方法：
* */
notSure = false; // okay, definitely a boolean
// notSure.ifItExists(); // okay, ifItExists might exist at runtime
// notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)

let prettySure: Object = 4;
// prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.

// 定义数组，数组里面类型不同的时候也该用any
let list2: any[] = [1, true, "free"];

list2[1] = 100;

// 空值（viod：它表示没有任何类型，就像其他语言里的void，来表示这个函数不返回值。）
function warnUser(): void {
  alert("This is my warning message");
}
// undefined和null：可以被赋值给任意变量

// 类型断言（类型断言好比其它语言里的类型转换，但是不进行特殊的数据检查和解构。 它没有运行时的影响，只是在编译阶段起作用）
let someValue: any = "this is a string";

// 第一种写法
let strLength: number = (<string>someValue).length;

// 第二种
let someValue1: any = "this is a string";

let strLength1: number = (someValue1 as string).length;

export {}